package com.tarena.charging.order.quartz;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/*
既然 ApplicationContextAware 实现可以获取到ApplicationContext
我们定义这个实现类 为一个桥梁工具 让job使用
 */
@Slf4j
@Component
public class SpringContextAwareUtils implements ApplicationContextAware {
    //实现类的成员变量 静态变量 来接收一下容器上下问题
    private static ApplicationContext applicationContext;
    //底层框架 通过这个方法 会通知实现类 有一个容器上下文存在
    @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        log.info("容器已经启动完成,当前ApplicationContextAware实现类 拿到一个对象:{}",applicationContext);
        //将容器上下文 给本类的静态变量
        if (applicationContext!=null){
            this.applicationContext=applicationContext;
        }
    }
    public static ApplicationContext getContext(){
        return applicationContext;
    }
    //获取bean对象 添加泛型的声明

    /**
       名字和类型同时生效 就能100%拿到一个唯一的bean
     * @param name bean的名字 比如orderController
     * @param clazz bean的类型
     * @return
     * @param <T>
     */
    public static <T> T getBean(String name,Class<T> clazz){
        return applicationContext.getBean(name,clazz);
    }
}
